/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ComNo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**
 *
 * @author Du
 */
public class NoComServidor {

    private int servPorta;
    private ServerSocket no;
    private InputStream in;

    public NoComServidor(int servPorta) {
        this.servPorta = servPorta;
    }

    public void OpComServidor() throws IOException {
        System.out.println("Servidor aguardando conexao...");
        no = new ServerSocket(servPorta);        //socket que fica ouvindo na porta 'servPort'
        Socket cliente = no.accept();
        
        in = cliente.getInputStream();          //associa a stream 'in' com o canal estabelecido
        String nArq = new String();             //string para receber o nome do arquivo desejado pelo cliente
        int op = 0;                             //variável que recebe se é operação de cópia ou exclusão de arquivo
        Scanner scan2 = new Scanner(in);
        //op: 1(copia de arquivo), 2(exclusao de arquivo), 3(atualizção de arquivo)
        if (scan2.hasNext()) {
            op = Integer.parseInt(scan2.nextLine());
        }
        if (scan2.hasNext()) {
            nArq = scan2.nextLine();
        }

        if (op == 1) {
            //procura o arquivo desejado pelo cliente

            File novo = new File("/opt/grupo08/" + nArq);
            /*novo.createNewFile();
             FileWriter fw = new FileWriter(novo);
             BufferedWriter bw = new BufferedWriter(fw);
             bw.write("Funcionou!");
             bw.flush();
             bw.close();*/


            FileInputStream ler = new FileInputStream(novo);        //stream na qual o servidor vai ler o arquivo que possui
            FileOutputStream envia = (FileOutputStream) cliente.getOutputStream();  //stream para enviar o arquivo ao cliente
            int tamanho2 = (int) novo.length();
            byte[] buffer = new byte[tamanho2];
            System.out.println("Servidor enviando arquivo...");
            while ((ler.read(buffer, 0, tamanho2)) != -1) {
                envia.write(buffer, 0, tamanho2);
            }

            //novo.delete();

            envia.flush();

            ler.close();
            envia.close();
        } else if (op == 2) {
            //Verificar se o arquivo existe(verificar no mestre)
            File arq = new File("/opt/grupo08/" + nArq);
            arq.delete();
        } else if (op == 3) {
            String host = new String();
            int tam2 = 0;
            if (scan2.hasNext()) {
                host = scan2.nextLine();
            }
            if(scan2.hasNext()){
                tam2 = Integer.parseInt(scan2.nextLine());
            }

//            NoComCliente clnt = new NoComCliente("frontend", servPorta, nArq);
//            clnt.CopiarArquivo();
            System.out.println("            Atualizando: " + host);
            Socket host2 = new Socket(host, servPorta);
            OutputStream out2 = host2.getOutputStream();
            in = host2.getInputStream();
            PrintStream envio2 = new PrintStream(out2);
            File arq1 = new File("/opt/grupo08/" + nArq);
            FileOutputStream grava = new FileOutputStream(arq1);
            byte[] buff = new byte[tam2];
            
            envio2.println("1");
            envio2.println(nArq);
            envio2.flush();
            
            System.out.println("Nome arquivo copia: " + nArq + ".txt ......e Atualizando arquivo");
            while ((in.read(buff, 0, tam2)) != -1) {
                grava.write(buff, 0, tam2);
            }
            
            envio2.close();
            out2.close();
            host2.close();
            grava.close();
            
        }


        no.close();
        cliente.close();
        in.close();

    }
}
